#ifndef USER_SESSION_SERVICE_H
#define USER_SESSION_SERVICE_H
#include <sqlite3.h>
#include <time.h>

// 用户会话结构体
typedef struct {
    long id;                  // 会话ID
    long user_id;             // 用户ID
    char connection_id[65];   // 连接ID (64字符 + 终止符)
    char *device_info;        // 设备信息 (可为NULL)
    char *ip_address;         // IP地址 (可为NULL)
    time_t created_at;        // 创建时间 (UNIX时间戳)
    time_t last_active;       // 最后活跃时间 (UNIX时间戳)
} UserSession;

// 错误码定义
#define DB_SUCCESS 0
#define DB_ERROR -1
/**
 * @brief 创建新会话
 * 
 * @param db SQLite3数据库连接
 * @param session 会话对象指针(包含要插入的数据)
 * @return int 操作结果(DB_SUCCESS 或 DB_ERROR)
 */
int create_session(sqlite3 *db, UserSession *session);

/**
 * @brief 根据用户ID更新连接ID
 * 
 * @param db SQLite3数据库连接
 * @param user_id 用户ID
 * @param new_connection_id 新的连接ID
 * @return int 操作结果(DB_SUCCESS 或 DB_ERROR)
 */
int update_connection_id_by_user_id(sqlite3 *db, long user_id, const char *new_connection_id);

/**
 * @brief 根据会话ID获取会话
 * 
 * @param db SQLite3数据库连接
 * @param session_id 要查询的会话ID
 * @return UserSession* 会话对象指针(使用后需调用free_session释放)
 */
UserSession* get_session_by_id(sqlite3 *db, long session_id);

/**
 * @brief 根据连接ID获取会话
 * 
 * @param db SQLite3数据库连接
 * @param connection_id 要查询的连接ID
 * @return UserSession* 会话对象指针(使用后需调用free_session释放)
 */
UserSession* get_session_by_connection_id(sqlite3 *db, const char *connection_id);

/**
 * @brief 根据用户ID获取所有会话
 * 
 * @param db SQLite3数据库连接
 * @param user_id 用户ID
 * @param count 返回会话数量的指针
 * @return UserSession** 会话对象指针数组(使用后需调用free_session_array释放)
 */
UserSession** get_sessions_by_user_id(sqlite3 *db, long user_id, int *count);

/**
 * @brief 删除会话
 * 
 * @param db SQLite3数据库连接
 * @param session_id 要删除的会话ID
 * @return int 操作结果(DB_SUCCESS 或 DB_ERROR)
 */
int delete_session(sqlite3 *db, long session_id);

/**
 * @brief 删除用户的所有会话
 * 
 * @param db SQLite3数据库连接
 * @param user_id 用户ID
 * @return int 操作结果(DB_SUCCESS 或 DB_ERROR)
 */
int delete_sessions_by_user_id(sqlite3 *db, long user_id);

/**
 * @brief 释放会话内存
 * 
 * @param session 要释放的会话对象指针
 */
void free_session(UserSession *session);

/**
 * @brief 释放会话数组内存
 * 
 * @param sessions 会话对象指针数组
 * @param count 会话数量
 */
void free_session_array(UserSession **sessions, int count);


#endif // USER_SESSION_SERVICE_H